home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / phpMyAdmin / libraries / dbi / mysqli.dbi.lib.php < prev   
PHP Script  |  2005-03-24  |  12KB  |  354 lines

  1. <?php
  2. /* $Id: mysqli.dbi.lib.php,v 2.36 2005/03/24 20:57:00 rabus Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4.  
  5. /**
  6.  * Interface to the improved MySQL extension (MySQLi)
  7.  */
  8.  
  9. /**
  10.  * Loads the MySQLi extension if it is not loaded yet
  11.  */
  12. if (!@function_exists('mysqli_connect')) {
  13.     PMA_dl('mysqli');
  14. }
  15.  
  16. // check whether mysql is available
  17. if (!@function_exists('mysqli_connect')) {
  18.     require_once('./libraries/header_http.inc.php');
  19.     echo sprintf($strCantLoad, 'mysqli') . '<br />' . "\n"
  20.          . '<a href="./Documentation.html#faqmysql" target="documentation">' . $GLOBALS['strDocu'] . '</a>' . "\n";
  21.     exit;
  22. }
  23.  
  24. // MySQL client API
  25. if (!defined('PMA_MYSQL_CLIENT_API')) {
  26.     $client_api = explode('.', mysqli_get_client_info());
  27.     define('PMA_MYSQL_CLIENT_API', (int)sprintf('%d%02d%02d', $client_api[0], $client_api[1], intval($client_api[2])));
  28.     unset($client_api);
  29. }
  30.  
  31. // Constants from mysql_com.h of MySQL 4.1.3
  32.  
  33. define('NOT_NULL_FLAG',         1);
  34. define('PRI_KEY_FLAG',          2);
  35. define('UNIQUE_KEY_FLAG',       4);
  36. define('MULTIPLE_KEY_FLAG',     8);
  37. define('BLOB_FLAG',            16);
  38. define('UNSIGNED_FLAG',        32);
  39. define('ZEROFILL_FLAG',        64);
  40. define('BINARY_FLAG',         128);
  41. define('ENUM_FLAG',           256);
  42. define('AUTO_INCREMENT_FLAG', 512);
  43. define('TIMESTAMP_FLAG',     1024);
  44. define('SET_FLAG',           2048);
  45. define('NUM_FLAG',          32768);
  46. define('PART_KEY_FLAG',     16384);
  47. define('UNIQUE_FLAG',       65536);
  48.  
  49. function PMA_DBI_connect($user, $password, $is_controluser = FALSE) {
  50.     global $cfg, $php_errormsg;
  51.  
  52.     $server_port   = (empty($cfg['Server']['port']))
  53.                    ? FALSE
  54.                    : (int) $cfg['Server']['port'];
  55.  
  56.     if (strtolower($cfg['Server']['connect_type']) == 'tcp') {
  57.         $cfg['Server']['socket'] = '';
  58.     }
  59.  
  60.     // NULL enables connection to the default socket
  61.     $server_socket = (empty($cfg['Server']['socket']))
  62.                    ? NULL 
  63.                    : $cfg['Server']['socket'];
  64.  
  65.     $link = mysqli_init();
  66.  
  67.     mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, TRUE);
  68.  
  69.     $client_flags = $cfg['Server']['compress'] && defined('MYSQLI_CLIENT_COMPRESS') ? MYSQLI_CLIENT_COMPRESS : 0;
  70.  
  71.     $return_value = @mysqli_real_connect($link, $cfg['Server']['host'], $user, $password, FALSE, $server_port, $server_socket, $client_flags);
  72.  
  73.     if ($return_value == FALSE) {
  74.         PMA_auth_fails();
  75.     } // end if
  76.  
  77.     PMA_DBI_postConnect($link, $is_controluser);
  78.  
  79.     return $link;
  80. }
  81.  
  82. function PMA_DBI_select_db($dbname, $link = NULL) {
  83.     if (empty($link)) {
  84.         if (isset($GLOBALS['userlink'])) {
  85.             $link = $GLOBALS['userlink'];
  86.         } else {
  87.             return FALSE;
  88.         }
  89.     }
  90.     if (PMA_MYSQL_INT_VERSION < 40100) {
  91.         $dbname = PMA_convert_charset($dbname);
  92.     }
  93.     return mysqli_select_db($link, $dbname);
  94. }
  95.  
  96. function PMA_DBI_try_query($query, $link = NULL, $options = 0) {
  97.     if ($options == ($options | PMA_DBI_QUERY_STORE)) {
  98.         $method = MYSQLI_STORE_RESULT;
  99.     } elseif ($options == ($options | PMA_DBI_QUERY_UNBUFFERED)) {
  100.         $method = MYSQLI_USE_RESULT;
  101.     } else {
  102.         $method = MYSQLI_USE_RESULT;
  103.     }
  104.  
  105.     if (empty($link)) {
  106.         if (isset($GLOBALS['userlink'])) {
  107.             $link = $GLOBALS['userlink'];
  108.         } else {
  109.             return FALSE;
  110.         }
  111.     }
  112.     if (defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION < 40100) {
  113.         $query = PMA_convert_charset($query);
  114.     }
  115.     return mysqli_query($link, $query, $method);
  116.     // From the PHP manual:
  117.     // "note: returns TRUE on success or FALSE on failure. For SELECT,
  118.     // SHOW, DESCRIBE or EXPLAIN, mysqli_query() will return a result object"
  119.     // so, do not use the return value to feed mysqli_num_rows() if it's
  120.     // a boolean
  121. }
  122.  
  123. // The following function is meant for internal use only.
  124. // Do not call it from outside this library!
  125. function PMA_mysqli_fetch_array($result, $type = FALSE) {
  126.     global $cfg, $allow_recoding, $charset, $convcharset;
  127.  
  128.     if ($type != FALSE) {
  129.         $data = @mysqli_fetch_array($result, $type);
  130.     } else {
  131.         $data = @mysqli_fetch_array($result);
  132.     }
  133.  
  134.     /* No data returned => do not touch it */
  135.     if (! $data) return $data;
  136.     
  137.     if (!defined('PMA_MYSQL_INT_VERSION') || PMA_MYSQL_INT_VERSION >= 40100
  138.         || !(isset($cfg['AllowAnywhereRecoding']) && $cfg['AllowAnywhereRecoding'] && $allow_recoding)) {
  139.         /* No recoding -> return data as we got them */
  140.         return $data;
  141.     } else {
  142.         $ret    = array();
  143.         $num    = mysqli_num_fields($result);
  144.         $fields = mysqli_fetch_fields($result);
  145.         $i = 0;
  146.         for ($i = 0; $i < $num; $i++) {
  147.             if (!$meta) {
  148.                 /* No meta information available -> we guess that it should be converted */
  149.                 if (isset($data[$i])) $ret[$i] = PMA_convert_display_charset($data[$i]);
  150.                 if (isset($data[$name])) $ret[PMA_convert_display_charset($name)] = PMA_convert_display_charset($data[$name]);
  151.             } else {
  152.                 /* Meta information available -> check type of field and convert it according to the type */
  153.                 if (stristr($fields[$i]->type, 'BLOB') || stristr($fields[$i]->type, 'BINARY')) {
  154.                     if (isset($data[$i])) $ret[$i] = $data[$i];
  155.                     if (isset($data[$fields[$i]->name])) $ret[PMA_convert_display_charset($fields[$i]->name)] = $data[$fields[$i]->name];
  156.                 } else {
  157.                     if (isset($data[$i])) $ret[$i] = PMA_convert_display_charset($data[$i]);
  158.                     if (isset($data[$fields[$i]->name])) $ret[PMA_convert_display_charset($fields[$i]->name)] = PMA_convert_display_charset($data[$fields[$i]->name]);
  159.                 }
  160.             }
  161.         }
  162.         return $ret;
  163.     }
  164. }
  165.  
  166. function PMA_DBI_fetch_array($result) {
  167.     return PMA_mysqli_fetch_array($result, MYSQLI_BOTH);
  168. }
  169.  
  170. function PMA_DBI_fetch_assoc($result) {
  171.     return PMA_mysqli_fetch_array($result, MYSQLI_ASSOC);
  172. }
  173.  
  174. function PMA_DBI_fetch_row($result) {
  175.     return PMA_mysqli_fetch_array($result, MYSQLI_NUM);
  176. }
  177.  
  178. function PMA_DBI_free_result($result) {
  179.     if (!is_bool($result)) {
  180.         return mysqli_free_result($result);
  181.     } else {
  182.         return 0;
  183.     }
  184. }
  185.  
  186. function PMA_DBI_getError($link = NULL) {
  187.     unset($GLOBALS['errno']);
  188.     if (empty($link)) {
  189.         if (isset($GLOBALS['userlink'])) {
  190.             $link = $GLOBALS['userlink'];
  191.             // Do not stop now. We still can get the error code
  192.             // with mysqli_connect_errno()
  193. //        } else {
  194. //            return FALSE;
  195.         }
  196.     }
  197.  
  198.     if (mysqli_connect_errno()) {
  199.         $error = mysqli_connect_errno();
  200.         $error_message = mysqli_connect_error();
  201.     } elseif ( !empty($link) && mysqli_errno($link)) {
  202.         $error = mysqli_errno($link);
  203.         $error_message = mysqli_error($link);
  204.     } 
  205.  
  206.     // keep the error number for further check after the call to PMA_DBI_getError()
  207.     if (!empty($error)) {
  208.         $GLOBALS['errno'] = $error;
  209.     } else {
  210.         return FALSE;
  211.     }
  212.  
  213.  
  214.     if ($error && $error == 2002) {
  215.         $error = '#' . ((string) $error) . ' - ' . $GLOBALS['strServerNotResponding'] . ' ' . $GLOBALS['strSocketProblem'];
  216.     } elseif ($error && defined('PMA_MYSQL_INT_VERSION') && PMA_MYSQL_INT_VERSION >= 40100) {
  217.         $error = '#' . ((string) $error) . ' - ' . $error_message;
  218.     } elseif ($error) {
  219.         $error = '#' . ((string) $error) . ' - ' . PMA_convert_display_charset($error_message);
  220.     }
  221.     return $error;
  222. }
  223.  
  224. function PMA_DBI_close($link = NULL) {
  225.     if (empty($link)) {
  226.         if (isset($GLOBALS['userlink'])) {
  227.             $link = $GLOBALS['userlink'];
  228.         } else {
  229.             return FALSE;
  230.         }
  231.     }
  232.     return @mysqli_close($link);
  233. }
  234.  
  235. function PMA_DBI_num_rows($result) {
  236.     // see the note for PMA_DBI_try_query();
  237.     if (!is_bool($result)) {
  238.         return @mysqli_num_rows($result);
  239.     } else {
  240.         return 0;
  241.     }
  242. }
  243.  
  244. function PMA_DBI_insert_id($link = '') {
  245.     if (empty($link)) {
  246.         if (isset($GLOBALS['userlink'])) {
  247.             $link = $GLOBALS['userlink'];
  248.         } else {
  249.             return FALSE;
  250.         }
  251.     }
  252.     return mysqli_insert_id($link);
  253. }
  254.  
  255. function PMA_DBI_affected_rows($link = NULL) {
  256.     if (empty($link)) {
  257.         if (isset($GLOBALS['userlink'])) {
  258.             $link = $GLOBALS['userlink'];
  259.         } else {
  260.             return FALSE;
  261.         }
  262.     }
  263.     return mysqli_affected_rows($link);
  264. }
  265.  
  266. function PMA_DBI_get_fields_meta($result) {
  267.     // Build an associative array for a type look up
  268.     $typeAr = Array();
  269.     $typeAr[MYSQLI_TYPE_DECIMAL]     = 'real';
  270.     $typeAr[MYSQLI_TYPE_TINY]        = 'int';
  271.     $typeAr[MYSQLI_TYPE_SHORT]       = 'int';
  272.     $typeAr[MYSQLI_TYPE_LONG]        = 'int';
  273.     $typeAr[MYSQLI_TYPE_FLOAT]       = 'real';
  274.     $typeAr[MYSQLI_TYPE_DOUBLE]      = 'real';
  275.     $typeAr[MYSQLI_TYPE_NULL]        = 'null';
  276.     $typeAr[MYSQLI_TYPE_TIMESTAMP]   = 'timestamp';
  277.     $typeAr[MYSQLI_TYPE_LONGLONG]    = 'int';
  278.     $typeAr[MYSQLI_TYPE_INT24]       = 'int';
  279.     $typeAr[MYSQLI_TYPE_DATE]        = 'date';
  280.     $typeAr[MYSQLI_TYPE_TIME]        = 'time';
  281.     $typeAr[MYSQLI_TYPE_DATETIME]    = 'datetime';
  282.     $typeAr[MYSQLI_TYPE_YEAR]        = 'year';
  283.     $typeAr[MYSQLI_TYPE_NEWDATE]     = 'date';
  284.     $typeAr[MYSQLI_TYPE_ENUM]        = 'unknown';
  285.     $typeAr[MYSQLI_TYPE_SET]         = 'unknown';
  286.     $typeAr[MYSQLI_TYPE_TINY_BLOB]   = 'blob';
  287.     $typeAr[MYSQLI_TYPE_MEDIUM_BLOB] = 'blob';
  288.     $typeAr[MYSQLI_TYPE_LONG_BLOB]   = 'blob';
  289.     $typeAr[MYSQLI_TYPE_BLOB]        = 'blob';
  290.     $typeAr[MYSQLI_TYPE_VAR_STRING]  = 'string';
  291.     $typeAr[MYSQLI_TYPE_STRING]      = 'string';
  292.     $typeAr[MYSQLI_TYPE_CHAR]        = 'string';
  293.     $typeAr[MYSQLI_TYPE_GEOMETRY]    = 'unknown';
  294.  
  295.     $fields = mysqli_fetch_fields($result);
  296.     foreach ($fields as $k => $field) {
  297.         $fields[$k]->type = $typeAr[$fields[$k]->type];
  298.         $fields[$k]->flags = PMA_DBI_field_flags($result, $k);
  299.         
  300.         // Enhance the field objects for mysql-extension compatibilty
  301.         $flags = explode(' ', $fields[$k]->flags);
  302.         array_unshift($flags, 'dummy');
  303.         $fields[$k]->multiple_key = (int)(array_search('multiple_key', $flags, true) > 0);
  304.         $fields[$k]->primary_key  = (int)(array_search('primary_key', $flags, true) > 0);
  305.         $fields[$k]->unique_key   = (int)(array_search('unique_key', $flags, true) > 0);
  306.         $fields[$k]->not_null     = (int)(array_search('not_null', $flags, true) > 0);
  307.         $fields[$k]->unsigned     = (int)(array_search('unsigned', $flags, true) > 0);
  308.         $fields[$k]->zerofill     = (int)(array_search('zerofill', $flags, true) > 0);
  309.         $fields[$k]->numeric      = (int)(array_search('num', $flags, true) > 0);
  310.         $fields[$k]->blob         = (int)(array_search('blob', $flags, true) > 0);
  311.     }
  312.     return $fields;
  313. }
  314.  
  315. function PMA_DBI_num_fields($result) {
  316.     return mysqli_num_fields($result);
  317. }
  318.  
  319. function PMA_DBI_field_len($result, $i) {
  320.     $info = mysqli_fetch_field_direct($result, $i);
  321.     // stdClass::$length will be integrated in 
  322.     // mysqli-ext when mysql4.1 has been released.
  323.     return @$info->length;
  324. }
  325.  
  326. function PMA_DBI_field_name($result, $i) {
  327.     $info = mysqli_fetch_field_direct($result, $i);
  328.     return $info->name;
  329. }
  330.  
  331. function PMA_DBI_field_flags($result, $i) {
  332.     $f = mysqli_fetch_field_direct($result, $i);
  333.     $f = $f->flags;
  334.     $flags = '';
  335.     if ($f & UNIQUE_FLAG)         { $flags .= 'unique ';}
  336.     if ($f & NUM_FLAG)            { $flags .= 'num ';}
  337.     if ($f & PART_KEY_FLAG)       { $flags .= 'part_key ';}
  338.     if ($f & SET_FLAG)            { $flags .= 'set ';}
  339.     if ($f & TIMESTAMP_FLAG)      { $flags .= 'timestamp ';}
  340.     if ($f & AUTO_INCREMENT_FLAG) { $flags .= 'auto_increment ';}
  341.     if ($f & ENUM_FLAG)           { $flags .= 'enum ';}
  342.     if ($f & BINARY_FLAG)         { $flags .= 'binary ';}
  343.     if ($f & ZEROFILL_FLAG)       { $flags .= 'zerofill ';}
  344.     if ($f & UNSIGNED_FLAG)       { $flags .= 'unsigned ';}
  345.     if ($f & BLOB_FLAG)           { $flags .= 'blob ';}
  346.     if ($f & MULTIPLE_KEY_FLAG)   { $flags .= 'multiple_key ';}
  347.     if ($f & UNIQUE_KEY_FLAG)     { $flags .= 'unique_key ';}
  348.     if ($f & PRI_KEY_FLAG)        { $flags .= 'primary_key ';}
  349.     if ($f & NOT_NULL_FLAG)       { $flags .= 'not_null ';}
  350.     return PMA_convert_display_charset(trim($flags));
  351. }
  352.  
  353. ?>
  354.